1 合并有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL)
return l2;
if(l2 == NULL)
return l1;
if(l1->val < l2->val){
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else{
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}
2 反转链表
ListNode* reversal_List(ListNode* head){
ListNode* p = head;
ListNode* newp = NULL;
if(head == NULL || head->next == NULL)
return head;
while(p!=NULL){
ListNode* temp;
temp = p->next;
p->next = newp;
newp = p;
p = temp;
}
return newp;
}
3 判断链表是否为回文结构
https://blog.csdn.net/alxe_made/article/details/90730724
方法1:使用栈O(N)辅助空间
借助一个STL的stack将我们的value放到栈当中,然后对比的时候从栈顶弹出元素,如果有一个不相等则返回false,否则返回true
bool isHuiwenList(ListNode* head){
stack<int> s;
ListNode* curNode = head;
while(curNode != NULL){
s.push(curNode->val);
curNode = curNode->next;
}
while(head!=NULL){
if(head->val!=s.top())
return false;
else{
head = head->next;
s.pop();
}
}
return true;
}
方法2:不使用辅助空间
快指针每次走两步,慢指针每次走一步。等到快指针遍历完链表,慢指针就正好停留在链表的中央。
将链表的后半部分进行反转。
将链表的前半部分与后半部分逐个比对。若都相同,则为回文链表,否则不是。
将反转之后右半部分的链表进行恢复.
bool isHuiwenList2(ListNode* head){
if (head == NULL || head->next == NULL)
return true;
ListNode* n1 = head;//慢指针
ListNode* n2 = head;//快指针
while(n2->next!=NULL && n2->next->next!=NULL){
n1 = n1->next;
n2 = n2->next->next;
}
//反转后半部分,n1为要反转的头结点
n2 = n1->next;
n1->next = NULL;
ListNode* temp = NULL;//辅助节点
while(n2 != NULL){
temp = n2->next;
n2->next = n1;//反转之后的头节点为n1
n1 = n2;
n2 = temp;
}
temp = n1;//保存反转后的头结点,以便于后面恢复
n2 = head;
while(n1!=NULL && n2!=NULL){
if(n1->val != n2->val)
return false;
else{
n1 = n1->next;
n2 = n2->next;
}
}
//将刚才反转的链表恢复原样
n1 = temp->next;//此处n1为辅助节点
temp->next = NULL;
while(n1!=NULL){
n2 = n1->next;
n1->next = temp;
temp = n1;
n1 = n2;
}
return true;
}
4 判断两个单向链表是否相交
1)方法1:
链表相交之后,后面的部分节点全部共用,可以用2个指针分别从这两个链表头部走到尾部,最后判断尾部指针的地址信息是否一样,若一样则代表链表相交!
2)方法2:
可以把其中一个链表的所有节点地址信息存到数组中,然后把另一个链表的每一个节点地址信息遍历数组,若相等,则跳出循环,说明链表相交。进一步优化则是进行hash排序,建立hash表。