合并两个有序单链表

1、合并两个有序链表

解法:因为两个链表都是有序的,可以定义一个虚拟节点,让两个链表的每个节点的数据域循环比较,不断将小的节点挂接在虚拟节点上串起一个新的链表。

eg:有如下两个单链表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTKPX61c-1573548701784)(en-resource://database/652:1)]
串上第一个节点
在这里插入图片描述
串上第二个
在这里插入图片描述
。。。直到最后

合并之后:
在这里插入图片描述

分析:不断地通过两个指向头节点的变量遍历链表,数据域小的那个挂接在新的链表上,定义一个head始终指向新链表的头,temp指向新链表的当前最后节点。找到一个就尾插。

详细步骤:

  • new一个虚拟节点并让head指向新节点的头,定义一个变量temp指向头
  • headA和headB两个变量分别遍历两个链表,两个节点的数据域进行比较,小地一个比如headA就尾插到temp的next域,然后headA指向下一个节点再跟headB比较。
  • 直到其中一个链表遍历完推出循环,此时如果两个链表不一样长,则总存在一个链表没有遍历完,由于两个链表都是有序的,所以剩下没有比较的一定都大于前面的,所以直接挂接在后面就可以了。

java描述的源代码

 public ListNode mergeTwoLists(ListNode headA, ListNode headB) {
        ListNode node = new ListNode(-1);
        ListNode temp = node;
        while(headA != null && headB != null){
            if(headA.val < headB.val){
                temp.next = headA;
                headA = headA.next;
                temp = temp.next;
            } else {
                temp.next = headB;
                headB = headB.next;
                temp = temp.next;
            }
        }
        if(headA != null){
            temp.next = headA;
        }
        if(headB != null){
            temp.next = headB;
        }
        return node.next;
    }
发布了52 篇原创文章 · 获赞 6 · 访问量 1473

猜你喜欢

转载自blog.csdn.net/qq_40488936/article/details/103033164
今日推荐