取消

21.合并两个有序链表

LeetCode题库-21.合并两个有序链表解题方法


一般方法

遍历两个链表,一一对比取得的元素,把小的元素放入新的链表中 如l1=[1,2,4],l2=[1,3,4]

  1. 创建一个新的链表ListNode newListNode=null;
  2. 使用两个指针分别指向两个链表的第一个元素l1_1=1,l2_1=1;
  3. 比较两个元素,如果第一个大于等于第二个,则取第二个链表的元素,否则取第一个链表的元素,这里取到L2_1,放入newListNode;
  4. 第二个链表移动到下一个元素l2_2,第一个链表还是第一个元素,重复第三步,直到一个链表取完元素,
  5. 这是如果另一个链表还有元素,直接把剩下的元素放到新链表尾部,因为原来的链表本来就是有序的

代码如下

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
43
44
45
46
47
48
49
50
51
52
53
54
public ListNode MergeTwoLists(ListNode l1, ListNode l2)
{
    if (l1 == null)
    {
        return l2;
    }
    if (l2 == null)
    {
        return l1;
    }

    ListNode newListNode = null;
    ListNode curListNode = null;

    var curListNode1 = l1;
    var curListNode2 = l2;

    while (curListNode1 != null && curListNode2 != null)
    {
        ListNode curListNodeNext = null;
        if (curListNode1.val > curListNode2.val)
        {
            curListNodeNext = new ListNode(curListNode2.val, null);
            curListNode2 = curListNode2.next;
        }
        else
        {
            curListNodeNext = new ListNode(curListNode1.val, null);
            curListNode1 = curListNode1.next;
        }
        if (curListNode == null)
        {
            curListNode = curListNodeNext;
            newListNode = curListNode;
        }
        else
        {
            curListNode.next = curListNodeNext;
        }

        curListNode = curListNodeNext;

    }

    if (curListNode1 != null)
    {
        curListNode.next = curListNode1;
    }
    else if (curListNode2 != null)
    {
        curListNode.next = curListNode2;
    }
    return newListNode;
}

递归思想

参考答案使用的递归思想,这个做法和汉诺塔的解法差不多,就是先取出小的一个元素,剩下的交给其他方法去排序,只要理解了思想这种方式代码简单得多,比如你们领导分提成的时候说:我拿一半,剩下的你们分。然后第二个领导也说:我拿一半,剩下的你们分。最后到你这里还有一半,要是叫你写算法来计算提成,用递归要简单很多。

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ListNode MergeTwoLists(ListNode l1, ListNode l2)
{
    if (l1 == null) return l2;
    if (l2 == null) return l1;
    if (l1.val <= l2.val)
    {
        l1.next = MergeTwoLists(l1.next, l2);
        return l1;
    }
    else
    {
        l2.next = MergeTwoLists(l1, l2.next);
        return l2;
    }
}

参考资料

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/21.%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%9C%89%E5%BA%8F%E9%93%BE%E8%A1%A8 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论