将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。

合并有序链表

http://www.nowcoder.com/questionTerminal/a479a3f0c4554867b35356e0d57cf03d

思路:本体没有要求必须使用交换元素的方式,即可以使用新的链表,这就简单多了!一开始陷进去是想不利用新的链表,将其排序整合,但是有些乱;
提示:处理头节点!

public class HeBingLinkedList {
    public static void main(String[] args) {
        //测试用
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        ListNode l2 = new ListNode(1);
        l2.next = new ListNode(3);

        ListNode listNode = mergeTwoLists(l1, l2);
        System.out.println(listNode);
    }

    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 判断边缘条件
        if (null == l1) return l2;
        if (null == l2) return l1;
        //把头节点小的部分作为新的节点
        boolean l1AsHead = l1.val < l2.val;
        ListNode res = new ListNode(l1AsHead ? l1.val : l2.val);
        //值传递机制可知,temp 和 res 操作同一个对象,但是,res 是头,temp 是其中用来操作的一个动态节点
        ListNode temp = res;

        //如果 l1 作为了头节点,那么 cur1 就表示 l1 剩下的部分,依次比较两个链表未合并部分的头
        ListNode cur1 = l1AsHead ? l1.next : l1;

        ListNode cur2 = l1AsHead ? l2 : l2.next;
        while (null != cur1 && null != cur2) {

            l1AsHead = cur1.val < cur2.val;
            temp.next = new ListNode(l1AsHead ? cur1.val : cur2.val);
              //注意这里要用 temp 来对 res 下一节点进行赋值
            temp = temp.next;

            cur1 = l1AsHead ? cur1.next : cur1;
            cur2 = l1AsHead ? cur2 : cur2.next;
        }

        //如果其中一条链表遍历结束,那么另外一条有序链表的 未比较的部分直接加入 res 之后
        if (null == cur1) temp.next = cur2;
        if (null == cur2) temp.next = cur1;
        return res;
    }


    public static class ListNode {
        int val;
        ListNode next = null;

        public ListNode(int val) {
            this.val = val;
        }

        @Override
        public String toString() {
            return " " + val + " - > " + next;
        }
    }
}
全部评论

相关推荐

三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务