0
点赞
收藏
分享

微信扫一扫

六六力扣刷题链表之合并两个有序链表


前言

之前小六六一直觉得自己的算法比较菜,算是一个短板吧,以前刷题也还真是三天打鱼,两台晒网,刷几天,然后就慢慢的不坚持了,所以这次,借助平台的活动,打算慢慢的开始开刷,并且自己还会给刷的题总结下,谈谈自己的一些思考,和自己的思路等等,希望对小伙伴能有所帮助吧,也可以借此机会把自己短板补一补,希望自己能坚持下去呀

链表

  • ​​六六力扣刷题链表之移除链表元素​​
  • ​​六六力扣刷题链表之反转链表​​
  • ​​六六力扣刷题链表之两两交换链表中的节点​​

链表的理论基础

链表的种类主要为:单链表,双链表,循环链表 链表的存储方式:链表的节点在内存中是分散存储的,通过指针连在一起。 链表是如何进行增删改查的。 数组和链表在不同场景下的性能分析。 可以说把链表基础的知识都概括了,但又不像教科书那样的繁琐。

虚拟头结点

链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。

每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题。

题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

六六力扣刷题链表之合并两个有序链表_算法

输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]

题解

迭代的写法

下面的写法是迭代的写法

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode res = new ListNode();
ListNode current=res;

while (list1!=null&&list2!=null){

if (list1.val>list2.val){
current.next=new ListNode(list2.val);
list2=list2.next;
}else {
current.next=new ListNode(list1.val);
list1=list1.next;
}
current=current.next;
}

if (list1==null){
current.next=list2;
}

if (list2==null){
current.next=list1;
}

return res.next;

递归的写法

/*
递归写法
*/
public static ListNode1 mergeTwoLists2(ListNode1 l1, ListNode1 l2) {

if (null == l1) {
return l2;
}

if (null == l2) {
return l1;
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return

结束

好了,今天的简单题就到这了,我是小六六,三天打鱼,两天晒网!大家加油,这题很简单的,最近几天我都要死磕链表,啊哈哈,冲冲冲。

举报

相关推荐

0 条评论