Day66:合并两个排序的链表

43 阅读2分钟

Day24 2023/01/31

题目链接

难度:简单

题目

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

数据范围:0≤n≤1000,1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6}

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过

思路


先设置一个虚拟头节点,依次比较两个链表的头节点,将节点数据较小的连接到虚拟头节点之后。直到两个链表中其中一个为空的时候,将另一个链表直接连接到虚拟头节点构成链表的尾节点上。
具体步骤:

  1. 遍历两个链表,当其中一个为空的时候退出循环。
  2. 遍历的过程中比较两个链表头节点的数据,将较小的插入到虚拟头节点所构成链表的尾部。
  3. 退出循环后将不为空的链表直接连接到虚拟头节点所构成链表的尾部。
  4. 返回真正的头节点。

算法实现-插入法


c++代码实现

```
public static void main(String[] args) {
    ListNode l1 = new ListNode(1,new ListNode(3,new ListNode(4,null)));
    ListNode l2 = new ListNode(2,new ListNode(4,new ListNode(5,null)));
    ListNode head = pinjie(l1,l2);
    while (head != null){
        System.out.println(head.data);
        head = head.next;
    }
}
```
static ListNode pinjie(ListNode head1,ListNode head2){
    ListNode temp1 = head1;
    ListNode temp2 = head2;
    ListNode ans = temp1.data <= temp2.data ? temp1 : temp2;
    ListNode temp3 = ans;
    if (ans.data == temp1.data) temp1 = temp1.next;
    else temp2 = temp2.next;
    while (temp1 != null && temp2 != null){
        if (temp1.data <= temp2.data && temp1 != null){
            temp3.next = temp1;
            temp1 = temp1.next;
            temp3 = temp3.next;
        } else if (temp1.data > temp2.data && temp2 != null) {
            temp3.next = temp2;
            temp2 = temp2.next;
            temp3 = temp3.next;
        }
    }
    while (temp2 != null){
        temp3.next = temp2;
        temp2 = temp2.next;
        temp3 = temp3.next;
    }
    while (temp1 != null){
        temp3.next = temp1;
        temp1 = temp1.next;
        temp3 = temp3.next;
    }
    return ans;
}
  • 时间复杂度 max(O(n),O(m)) --- 其中n和m分别为两个链表的长度
  • 空间复杂度 O(1) --- 操作的都是原有的节点,没有额外的辅助空间