今日题目
本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
话不多说, 直接开刷~~ 今天的两道题都算是最基础最简单的了.
合并两个有序链表
题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
解题思路:
(1) 这道题其实就类似于之前本系列中一道题的子问题, 具体是是哪道题也不知道了, 印象很深.
(2) 思路非常简单, 定义一个新的链表头, 然后分别比较所给两个链表的节点值, 将小的逐一插入到新的链表中.
(3) 最后看哪个链表还有剩下的元素, 将剩下的节点全部插到新的链表后面去即可.
实现代码:
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode head=new ListNode();
ListNode cur=head;
while(list1!=null&&list2!=null){
if(list1.val<=list2.val){
cur.next=list1;
list1=list1.next;
}else{
cur.next=list2;
list2=list2.next;
}
cur=cur.next;
}
if(list1!=null){
cur.next=list1;
}
if(list2!=null){
cur.next=list2;
}
return head.next;
}
}
删除链表中重复的结点
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5.
数据范围:链表长度满足 0 \le n \le 1000 \0≤n≤1000 ,链表中的值满足 1 \le val \le 1000 \1≤val≤1000.
解题思路:
(1) 我记得之前这个系列中有一道题, 与本题的题目是类似又不完全像, 但是那道题需要使用到的方法是前缀和+哈希表, 印象深刻(因为那题真被震惊到), 相比来说, 本题就是弱化版了.
(2) 本题可以使用前中后指针的方法来解决.
(3) 前中指针在前面进行遍历比较, 如若前指针的值与中指针的值不相等, 那么三个指针一起往下一个节点走即可; 如若前指针的值与中指针的值是相等的, 那么中指针停留在原地, 前指针继续往前走… 直到前指针的值与中指针的值不相等的时候, 直接让后指针跳到前指针的位置上即可, 让中指针指向后指针, 前指针指向后指针的下一个节点, 如此循环… 直到将链表遍历完后, 形成的新的链表就是所求的链表.
实现代码:
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
if(pHead==null){
return null;
}
ListNode head=new ListNode(-1);
head.next=pHead;
ListNode cur=head;
ListNode slow=pHead;
ListNode fast=pHead.next;
while(fast!=null){
if(slow.val!=fast.val){
cur=slow;
slow=fast;
fast=fast.next;
}else{
while(fast!=null&&slow.val==fast.val){
fast=fast.next;
}
cur.next=fast;
if(cur.next!=null){
slow=fast;
fast=fast.next;
}
}
}
return head.next;
}
}