题解 | #相反链表的合并#
相反链表的合并
https://www.nowcoder.com/practice/0222a3c31a404dd3b8c3341d189477f4?tpId=363&tqId=10614066&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj
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
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~

九号公司成长空间 1人发布