import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param l1 ListNode类 * @param l2 ListNode类 * @return ListNode类 */ public ListNode mergeLists (ListNode l1, ListNode l2) { ListNode reverseListNode2 = reverse(l2); ListNode temp = new ListNode(-1); ListNode result = temp; // 循环条件: l1和l2都不为空指针 while (l1 != null && reverseListNode2 != null) { // 选择较小的一个进行节点值的合并 if (l1.val < reverseListNode2.val) { temp.next = l1; temp = temp.next; l1 = l1.next; } else { temp.next = reverseListNode2; temp = temp.next; reverseListNode2 = reverseListNode2.next; } } temp.next = l1 == null?reverseListNode2:l1; return result.next; } // 翻转链表,将链表变成升序 public ListNode reverse(ListNode treeNode) { ListNode prev = null; ListNode cur = treeNode; while (cur != null) { ListNode next = cur.next; cur.next = prev; prev = cur; cur = next; } return prev; } }
本题知识点分析:
1.反转链表
2.前驱结点和后继结点
3.数学模拟
本题解题思路分析:
1.将链表2进行反转,变成降序链表
2.比较链表1和链表二,因为反转之后,两个链表都是升序,从链表头开始遍历,选择较小值添加到的新的链表中
3.因为两个链表长度可能不一样,所以会导致一个遍历完成之后,一个还没有遍历完成,因此,要进行判断,将还没有遍历完的链表添加到尾巴中
4.最后返回虚拟头结点的.next即可
这题也可以用递归做,但是空间复杂度反而高,迭代是较好的解法。
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~