160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> set=new HashSet<ListNode>();
ListNode p=headA;
while(p!=null)
{
set.add(p);
p=p.next;
}
p=headB;
while(p!=null)
{
if(set.contains(p))
return p;
p=p.next;
}
return null;
}
}
个人总结: 中规中矩,缺乏新意。注意此类问题(类似环形)都是对路程的分析。
82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
/**
* 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 deleteDuplicates(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode h=new ListNode(-101,head);
ListNode p=h.next,pre=h;
int x=101;
while(p.next!=null)
{
if(p.val==p.next.val)
{
x=p.val;
p=p.next;
}
else
{
if(p.val==x)
{
pre.next=p.next;
p=pre.next;
}else
{
pre=p;
p=p.next;
}
}
}
if(p.val==x)
pre.next=p.next;
return h.next;
}
}
个人总结: 代码不够简洁,需注意细节。