链表合并(反思自己的链表学习!!!!)
Posted dazhu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表合并(反思自己的链表学习!!!!)相关的知识,希望对你有一定的参考价值。
1:题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2:题目分析
首先注意链表和数组的区别,在对数组操作时,如果不想再原本的数组上操作,则必须new一个新的数组空间。而链表则只需要增加增加一个head就可以了。
本题的解决思路如下;
- 初始化curL1Node和curL2Node指向两个带合并的链表head,新建一个newHead节点。
- 比较curL1Node和curL2Node,将小者移到newHead后。
- 小者后移一位。
- 重复2-3,直到其中有一个null。
- 将不为null的链表置于newHead后
- return newHead.next即可
在原始的链表上操作容易混乱,所以最好新建一个newHead节点,用来将节点移到这里容易表示。
3:代码示例
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode curL1Node = l1; ListNode curL2Node = l2; ListNode newHead = new ListNode(0); ListNode curNewNode = newHead; while (true) { //l1或l2遍历完后,则结束。 if (curL1Node == null || curL2Node == null) { break; } else { //curL1Node.val和curL2Node.val //则较小节点放在newHead后。 if (curL1Node.val <= curL2Node.val) { curNewNode.next = curL1Node; //较小节点后移 curL1Node = curL1Node.next; } else { curNewNode.next = curL2Node; //较小节点后移 curL2Node = curL2Node.next; } //newHead节点后移 curNewNode = curNewNode.next; } } //一旦退出循环,则意味着有链表已经为null, // 将不为null都移到newHead后面 if(curL1Node!=null){ curNewNode.next = curL1Node; } if(curL2Node!=null){ curNewNode.next = curL2Node; } return newHead.next; } }
以上是关于链表合并(反思自己的链表学习!!!!)的主要内容,如果未能解决你的问题,请参考以下文章
《剑指Offer——合并两个排序的链表,两个链表的第一个公共节点》代码