【Leetcode Algorithm】Merge Two Sorted Lists

来源:互联网 发布:淘宝账号自助开通网址 编辑:程序博客网 时间:2024/05/15 13:53


Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
自己尝试的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //如果l1和l2有一个为空,则返回对方
        if(l1==null){
            return l2;
        }
        else if(l2==null){
            return l1;
        }
        //定义一个头结点head用来返回排序后的list
        ListNode head;
        //定义一个中间结点,用于结点互换
        ListNode tmp;
        //头结点head,指向l1
        if(l1.val>l2.val){
            tmp = l1;
            l1 = l2;
            l2 = tmp;
        }
        head = l1;
        //l1结点相比l2结点,永远存放较小的数
        while(l1.next!=null){
            if(l1.next.val>l2.val){
                tmp = l1.next;
                l1.next = l2;
                l2 = tmp;
            
            l1 = l1.next;
        }
        //将剩余的l2,接到l1的后面
        l1.next = l2;
        return head;
    }
}

虽然通过了,但是可读性差,不是好程序。
改进后的代码即简洁又美观!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //定义排序后的新链表的头结点为head
        ListNode head = new ListNode(0);
        ListNode p = head;
        //当l1,l2两个结点都不为空时,选取两个结点值最小的作为p的后继结点
        while(l1!=null&&l2!=null){
            if(l1.val<l2.val){
                p.next = l1;
                l1 = l1.next;
            }
            else{
                p.next = l2;
                l2 = l2.next;
            }
            p = p.next;
        }
        //将剩下的结点连到p的后面
        if(l1!=null){
            p.next = l1;
        }
        if(l2!=null){
            p.next = l2;
        }
        return head.next;
    }
}











Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
自己尝试的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //如果l1和l2有一个为空,则返回对方
        if(l1==null){
            return l2;
        }
        else if(l2==null){
            return l1;
        }
        //定义一个头结点head用来返回排序后的list
        ListNode head;
        //定义一个中间结点,用于结点互换
        ListNode tmp;
        //头结点head,指向l1
        if(l1.val>l2.val){
            tmp = l1;
            l1 = l2;
            l2 = tmp;
        }
        head = l1;
        //l1结点相比l2结点,永远存放较小的数
        while(l1.next!=null){
            if(l1.next.val>l2.val){
                tmp = l1.next;
                l1.next = l2;
                l2 = tmp;
            
            l1 = l1.next;
        }
        //将剩余的l2,接到l1的后面
        l1.next = l2;
        return head;
    }
}

虽然通过了,但是可读性差,不是好程序。
改进后的代码即简洁又美观!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //定义排序后的新链表的头结点为head
        ListNode head = new ListNode(0);
        ListNode p = head;
        //当l1,l2两个结点都不为空时,选取两个结点值最小的作为p的后继结点
        while(l1!=null&&l2!=null){
            if(l1.val<l2.val){
                p.next = l1;
                l1 = l1.next;
            }
            else{
                p.next = l2;
                l2 = l2.next;
            }
            p = p.next;
        }
        //将剩下的结点连到p的后面
        if(l1!=null){
            p.next = l1;
        }
        if(l2!=null){
            p.next = l2;
        }
        return head.next;
    }
}











0 0
原创粉丝点击